package com.fauks.se.design_mode.代理模式.dynamic_proxy;

/**
 * 不需要代理对象，在程序运行时自动生成
 */
public class DynamicProxy {
    public static void main(String[] args) {
        //byJDKProxy();
        byCglib();
    }

    /**
     * 使用CGlib实现动态代理，用于目标类没有实现接口的情况
     * 1.使用子类增强父类（目标类不能被final修饰）
     */
    private static void byCglib() {
        CalcImpl calc = new MyCglibFactory().myCglibCreator();
        int add = calc.add(1, 2);
        System.out.println(add);
    }

    /**
     * JDK动态代理
     * 1.目标类必须实现接口，因为底层的执行原理与静态代理相同
     */
    private static void byJDKProxy() {
        ICalc iCalc = new CalcImpl();
        Object proxy = new JDKProxyHandler(iCalc).getProxy();
        //proxy对象不能转换为接口实现类仅仅是代理类与目标类实现相同接口
        ICalc calc = (ICalc) proxy;
        System.out.println(calc.add(1, 2));
    }
}
